﻿using System;
using System.Collections.Generic;
using System.Text;

using FCNS.KeepMoneyLibrary.Data;

namespace FCNS.KeepMoneyLibrary.Util
{
    class HealthStatusUtil
    {
        /*
         * 银行财务实力评级定义
　　A
　　评级为A的银行内在财务实力最强。这些机构通常拥有极具价值和抗御力强的营运特权、稳固的财务基本面及非常易于预见和非常稳定的营运环境。
　　B
　　评级为B的银行内在财务实力强。这些机构通常拥有具价值且抗御力强的营运特权、良好的财务基本面及可预见和稳定的营运环境。
　　C
　　评级为C的银行内在财务实力尚可。这些机构通常拥有更为有限的有价值的营运特权。他们或者在一个稳定的营运环境中拥有可令人接受的财务基本面，或者在一个不稳定性的营运环境中拥有好过平均水平的财务基本面。
　　D
　　评级为D的银行内在财务实力一般，有时可能需要一些外部支持。此类机构可能受到以下一项或多项因素的制约：特许权价值低；财务基本面在一个或多个方面存在不足；或营运环境不可预见且不稳定。
　　E
　　评级为E的银行内在财务实力很一般，需要定期外部支持或最终需要外部协助的可能性较高。此类机构可能受到以下一项或多项因素的制约：特许权价值低且有限；财务基本面在一个或多个方面存在严重不足；或营运环境极难预见且极不稳定。
　　附注：适当情况下，在“A”类别以下的评级后附上“+”符号及“E”类别以上的评级后附上“-”符号，以区别属于中间类别的银行。
         */
        public enum Level
        {
            A = 0,
            B,
            C,
            D,
            E,
            F,
            G
        }

        /*
         * 合计金额>=0?2:3
         * 年合计>=0?-1:+1
         * 月合计>=0?-1:+1
         */
        public static Level GetStatus()
        {
            int value = 3;
            if ((globalIncome - globalExpense) < 0)
                value += 1;

            if (IncomePlusExpenseYearly < 0)
                value += 1;

            return (Level)value;
        }



        internal static void AddEntry(EntryField field)
        {
            if (field.Money > 0)
                globalIncome += field.Money;
            else
                globalExpense += field.Money;
        }

        internal static void RemoveEntry(EntryField field)
        {
            if (field.Money > 0)
                globalIncome -= field.Money;
            else
                globalExpense -= field.Money;
        }

        internal static void EditEntry(EntryField field, decimal newValue)
        {
            if (field.Money > 0)
                globalIncome += (newValue - field.Money);
            else
                globalExpense += (newValue - field.Money);
        }


        static decimal IncomePlusExpenseYearly = 0;


        static decimal globalIncome = 0;
        public static decimal GlobalIncome
        {
            get
            {
                if (globalIncome == 0)
                    CalculateStatistics();

                return globalIncome;
            }
        }

        static decimal globalExpense = 0;
        public static decimal GlobalExpense
        {
            get
            {
                if (globalExpense == 0)
                    CalculateStatistics();

                return globalExpense;
            }
        }

        private static void CalculateStatistics()
        {
            globalIncome = 0; globalExpense = 0; IncomePlusExpenseYearly = 0;

            List<EntryField> fields=EntryField.GetEntryField.FindAll(ef => { return ef.EntryType != KMDEntryType.Transfer; });
            int year = DateTime.Now.Year;
            foreach (EntryField ef in fields)
            {
                if (ef.Money > 0)
                    globalIncome += ef.Money;
                else
                    globalExpense += ef.Money;

                if (ef.Date.Year == year)
                    IncomePlusExpenseYearly += ef.Money;
            }
        }
    }
}